package com.rw.coco.handler.message.reply.handler.command.sender;

import com.rw.coco.api.data.model.AccountModel;
import com.rw.coco.handler.message.event.CocoGroupMessageEvent;
import com.rw.coco.service.ObService;
import com.rw.coco.util.config.CocoOption;
import com.rw.tool.util.string.StringUtil;

import java.util.List;

/**
 * 群旁观处理对象
 */
public class ObSender extends BaseGroupSender {
    public ObSender(CocoGroupMessageEvent event) {
        super(event);
    }

    /**
     * 进入旁观
     */
    public void obIn() {
        // 如果没有开启群OB开关
        if (!groupModel.getObSwitch()) {
            groupEvent.sendBack(optionReply.obSwitchIsNotOn(groupEvent));
            return;
        }

        // 查询群内所有的旁观用户
        ObService obService = new ObService(groupEvent);
        List<AccountModel> accountList = obService.getObAccount(group.getId());
        // 如果发送者已经加入了旁观列表
        if (accountList.stream().anyMatch(accountModel ->
                StringUtil.equals(accountModel.getAccountId(), sender.getId()))) {
            groupEvent.sendBack(optionReply.obAlreadyIn(groupEvent));
            return;
        }

        // 加入群旁观列表，并返回
        obMapper.obGroup(group.getId(), sender.getId());
        groupEvent.sendBack(optionReply.obIn(groupEvent));
    }

    /**
     * 退出旁观
     */
    public void obExit() {
        // 退出群旁观并发送返回指令
        obMapper.exitGroupObList(group.getId(), sender.getId());
        groupEvent.sendBack(optionReply.obExit(groupEvent));
    }

    /**
     * 旁观列表
     */
    public void obList() {
        // 查询群内所有的旁观用户
        ObService obService = new ObService(groupEvent);
        List<AccountModel> accountList = obService.getObAccount(group.getId());

        groupEvent.sendBack(optionReply.obList(groupEvent, accountList));
    }

    /**
     * 清空群旁观列表
     */
    public void obClear() {
        if (admin || accountModel.getSuperAdmin()) {
            // 如果是群管理员，或者是超级管理员，则清空旁观列表
            obMapper.clearGroupObList(group.getId());
            groupEvent.sendBack(optionReply.obClear(groupEvent));
        } else {
            // 如果不是管理员，则返回无权限
            groupEvent.sendBack(optionReply.obClearWithoutAuthorize(groupEvent));
        }
    }

    /**
     * 开启群旁观
     */
    public void obOn() {
        if (admin || accountModel.getSuperAdmin()) {
            // 如果是群管理员，或者是超级管理员，则开启群旁观
            groupMapper.groupObSwitch(group.getId(), true);
            groupEvent.sendBack(optionReply.obOn(groupEvent));
        } else {
            groupEvent.sendBack(optionReply.obOnWithoutAuthorize(groupEvent));
        }
    }

    /**
     * 开启群旁观
     */
    public void obOff() {
        if (admin || accountModel.getSuperAdmin()) {
            // 如果是群管理员，或者是超级管理员，则关闭群旁观
            groupMapper.groupObSwitch(group.getId(), false);
            groupEvent.sendBack(optionReply.obOff(groupEvent));
        } else {
            groupEvent.sendBack(optionReply.obOffWithoutAuthorize(groupEvent));
        }
    }

    /**
     * 向群内所有OB旁观的人发送结果
     *
     * @param result   结果
     */
    public void sendAllObResult(String result) {
        // 如果群旁观功能未开启，则直接返回
        boolean funcSwitch = cocoOption.optionProp.getBoolean(CocoOption.COCO_OB);
        if (!funcSwitch || !groupEvent.getGroupModel().getObSwitch()) {
            return;
        }

        // 获得群内OB列表，并对OB的人发送暗骰结果
        ObService obService = new ObService(groupEvent);
        List<AccountModel> accountList = obService.getObAccount(groupEvent.getGroup().getId());

        // 发送暗骰
        for (AccountModel accountModel : accountList) {
            // 如果旁观的人不是发送者，并且不在黑名单内，则发送暗骰结果
            boolean isSender = StringUtil.equals(groupEvent.getSender().getId(), accountModel.getAccountId());
            boolean isBlackList = accountModel.getBlackList();
            if (!isSender && !isBlackList) {
                groupEvent.sendPrivate(result, accountModel.getAccountId());
            }
        }
    }
}
